//package com.sg.java;
//
//import cn.hutool.core.util.IdUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.sg.java.entity.VoltageQualified;
//import com.sg.java.entity.VoltageQualifiedVo;
//import org.apache.commons.csv.CSVFormat;
//import org.apache.commons.csv.CSVParser;
//import org.apache.commons.csv.CSVRecord;
//
//import java.io.File;
//import java.io.FileReader;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//
///**
// * date: 2022/7/16 下午 7:23
// *
// * @author LIKEGAKKI
// * Description:
// */
//
//public class QYHYDataComputeStrategy {
//
//    protected HashMap<String, String> orgTreeMap = new HashMap<>();
//
//    protected HashMap<String, Record> qyhyMap = new HashMap<>();
//
//    protected HashMap<String, Record> qyhyMap2 = new HashMap<>();
//
//    public QYHYDataComputeStrategy(Configuration configuration) {
//
//        List<VoltageQualified> result = new ArrayList<>();
//        // 加载树形结构
//        HashMap<String, List<VoltageQualifiedVo>> map = new HashMap<>();
//
//
//        result.forEach(v -> {
//            if (map.containsKey(v.getDydj())) {
//                VoltageQualifiedVo vo = new VoltageQualifiedVo();
//                List<VoltageQualifiedVo> list = map.get("1");
//                list.add(vo);
//            } else {
//                List<VoltageQualifiedVo> list = new ArrayList<>();
//                VoltageQualifiedVo vo = new VoltageQualifiedVo();
//                list.add(vo);
//            }
//
//        });
//        String keyNode = "111";
//
//
//        String[] headers = {"orgId,pOrgId"};
//        CSVFormat formator = CSVFormat.DEFAULT.withHeader(headers);
//
//        String filePath = System.getProperty("user.dir") + File.separator + "conf" + File.separator + "org.csv";
//
//        FileReader fileReader = null;
//        CSVParser parser = null;
//        try {
//            fileReader = new FileReader(filePath);
//            parser = new CSVParser(fileReader, formator);
//            for (CSVRecord next : parser) {
//                orgTreeMap.put(next.get(0), next.get(1));
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//            throw DataXException.asDataXException(e.getMessage());
//        } finally {
//            try {
//                parser.close();
//                fileReader.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    @Override
//    public void excute(Configuration configuration, RecordSender recordSender, List<VoltageQualifiedVo> voltageQualifiedVos) {
//        voltageQualifiedVos.forEach(voltageQualifiedVo -> {
//            // 如果orgNo为空就先不处理 TODO 具体处理方案未明确
//            String orgNo = voltageQualifiedVo.getOrgNo();
//            if (StrUtil.isNotEmpty(orgNo)) {
//                // 分区域分电压
//                compute(voltageQualifiedVo, orgNo, true, qyhyMap);
//                // 只分区域
//                compute(voltageQualifiedVo, orgNo, false, qyhyMap2);
//            }
//        });
//    }
//
//    @Override
//    public void save(RecordSender recordSender) {
//        qyhyMap.forEach((k, v) -> recordSender.sendToWriter(v));
//        qyhyMap2.forEach((k, v) -> {
//            // 总的电压等级为0
//            v.setColumn(QYHYKeyEnum.VOLTAGE_LEVEL.ordinal(), new DoubleColumn(0));
//            recordSender.sendToWriter(v);
//        });
//    }
//
//
//    public void compute(VoltageQualifiedVo vo, String orgNo, boolean voltageLevelGroup, HashMap<String, Record> map) {
//        // 1.计算当前区域的
//        // 1.1 获取当前区域已经统计的信息
//        String qyhyMapkey;
//        if (voltageLevelGroup) {
//            qyhyMapkey = orgNo + vo.getVoltageLevel();
//        } else {
//            qyhyMapkey = orgNo;
//        }
//        Record record = map.get(qyhyMapkey);
//        //Record record = qyhyMap.get(orgNo);
//        if (ObjectUtil.isNull(record)) {
//            Record orgUserRecord = createOrgUserRecord(vo, orgNo);
//            map.put(qyhyMapkey, orgUserRecord);
//        } else {
//            Record pOrgUserRecord = map.get(qyhyMapkey);
//            updateOrgUserRecord(pOrgUserRecord, vo);
//            // 重新设置值
//            map.put(qyhyMapkey, pOrgUserRecord);
//        }
//        String pOrgNo = this.orgTreeMap.get(orgNo);
//        if (StrUtil.isEmpty(pOrgNo)) {
//            return;
//        }
//        // 计算父级的
//        compute(vo, pOrgNo, voltageLevelGroup, map);
//    }
//
//    public Record createOrgUserRecord(VoltageQualifiedVo vo, String orgNo) {
//        // 创建节点记录
//        DefaultRecord orgUserRecord = new DefaultRecord();
//        long id = IdUtil.getSnowflakeNextId();
//        // 主键
//        orgUserRecord.addColumn(new LongColumn(id));
//        Date date = new Date();
//        // 创建时间
//        orgUserRecord.addColumn(new DateColumn(date));
//        // 统计时间
//        orgUserRecord.addColumn(new DateColumn(vo.getDateTime()));
//        // 区域编码
//        orgUserRecord.addColumn(new StringColumn(orgNo));
//        // 电压等级
//        orgUserRecord.addColumn(new DoubleColumn(vo.getVoltageLevel()));
//        // 电网类型
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 总用户数
//        orgUserRecord.addColumn(new DoubleColumn(1));
//        // 实际用户数
//        orgUserRecord.addColumn(new DoubleColumn(1));
//        // 实测率/设置率
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 有数据用户数量
//        double dataUserNum = vo.getDyPracticalCount() > 0 ? 1 : 0;
//        orgUserRecord.addColumn(new DoubleColumn(dataUserNum));
//        // 监测率
//        orgUserRecord.addColumn(new DoubleColumn(1));
//        // 有效数据用户量
//        Double validDataTime = vo.getValidDataTime();
//        double efficientUserNum = validDataTime > 0 ? 1 : 0;
//        orgUserRecord.addColumn(new DoubleColumn(efficientUserNum));
//        // 有效率  (有效数据用户量 / 有数据用户数量) * 100
//        double efficientUserRate = dataUserNum == 0 || efficientUserNum == 0 ? 0 : (dataUserNum / efficientUserNum) * 100;
//        orgUserRecord.addColumn(new DoubleColumn(efficientUserRate));
//
//        Double monitorTime = vo.getMonitorTime();
//        Double upTime = vo.getUpTime();
//        Double downTime = vo.getDownTime();
//        // 电压合格率
//        double voltageQualifiedRate = monitorTime == 0 ? 0 : (1 - ((upTime + downTime) / monitorTime)) * 100;
//        orgUserRecord.addColumn(new DoubleColumn(voltageQualifiedRate));
//        // 投诉率  TODO 投诉率数据来源和计算公式
//        orgUserRecord.addColumn(new DoubleColumn(0));
//
//        double qualifiedUserNum = 0;
//        double lowVoltageUserNum = 0;
//        double highVoltageUserNum = 0;
//        String pbtype = vo.getPbtype();
//        if (PbTypeConstant.GY.equals(pbtype)) {
//            highVoltageUserNum++;
//        } else if (PbTypeConstant.DY.equals(pbtype)) {
//            lowVoltageUserNum++;
//        } else {
//            qualifiedUserNum++;
//        }
//        // 合格电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(qualifiedUserNum));
//        // 低电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(lowVoltageUserNum));
//        // 高电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(highVoltageUserNum));
//        // 严重低电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 严重高电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 长期低电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 长期高电压用户数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 低电压用户占比
//        double lowVoltageUserRate = lowVoltageUserNum * 100;
//        orgUserRecord.addColumn(new DoubleColumn(lowVoltageUserRate));
//        // 高电压用户占比
//        double highVoltageUserRate = highVoltageUserNum * 100;
//        orgUserRecord.addColumn(new DoubleColumn(highVoltageUserRate));
//        // 严重低电压用户占比
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 严重高电压用户占比
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 长期低电压用户占比
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 长期高电压用户占比
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 监测总时间
//        orgUserRecord.addColumn(new DoubleColumn(monitorTime));
//        // 合格时间
//        double qualifiedTime = monitorTime - upTime - downTime;
//        orgUserRecord.addColumn(new DoubleColumn(qualifiedTime));
//        // 超上限时间
//        orgUserRecord.addColumn(new DoubleColumn(upTime));
//        // 超上限率
//        double upRate = (upTime / monitorTime) * 100;
//        orgUserRecord.addColumn(new DoubleColumn(upRate));
//        // 超下限时间
//        orgUserRecord.addColumn(new DoubleColumn(downTime));
//        // 超下限率
//        double downRate = (downTime / monitorTime) * 100;
//        orgUserRecord.addColumn(new DoubleColumn(downRate));
//        // 严重低电压台区数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 严重高电压台区数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 长期低电压台区数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 长期高电压台区数量
//        orgUserRecord.addColumn(new DoubleColumn(0));
//        // 电压最大值
//        Double maxValue = vo.getMaxValue();
//        orgUserRecord.addColumn(new DoubleColumn(maxValue));
//        // 电压最大值发生时刻
//        Date maxValueTime = vo.getMaxValueTime();
//        orgUserRecord.addColumn(new DateColumn(maxValueTime));
//        // 电压最小值
//        Double minValue = vo.getMinValue();
//        orgUserRecord.addColumn(new DoubleColumn(minValue));
//        // 电压最小值发生时刻
//        Date minValueTime = vo.getMinValueTime();
//        orgUserRecord.addColumn(new DateColumn(minValueTime));
//        // 异常情况，储存异常编码
//        orgUserRecord.addColumn(new StringColumn(""));
//        // 有效数据时间
//        orgUserRecord.addColumn(new DoubleColumn(validDataTime));
//
//        return orgUserRecord;
//    }
//
//
//    public void updateOrgUserRecord(Record pOrgUserRecord, VoltageQualifiedVo vo) {
//
//        Double realUserNum = pOrgUserRecord.getColumn(QYHYKeyEnum.REAL_USER_NUM.ordinal()).asDouble();
//        realUserNum++;
//        // todo 部门老大说 用户数和实际用户数一样
//        pOrgUserRecord.setColumn(QYHYKeyEnum.REAL_USER_NUM.ordinal(), new DoubleColumn(realUserNum));
//        pOrgUserRecord.setColumn(QYHYKeyEnum.USER_NUM.ordinal(), new DoubleColumn(realUserNum));
//
//        // TODO 实测率/设置率
//
//        // 有数据用户数量
//        Double validDataTime = vo.getValidDataTime();
//        if (0 < validDataTime) {
//            Double dataUserNum = pOrgUserRecord.getColumn(QYHYKeyEnum.DATA_USER_NUM.ordinal()).asDouble();
//            pOrgUserRecord.setColumn(QYHYKeyEnum.DATA_USER_NUM.ordinal(), new DoubleColumn(dataUserNum + 1));
//        }
//
//        // 监测率 todo
//
//        // 有效数据用户数量
//        Double dyPracticalCount = vo.getDyPracticalCount();
//        if (0 < dyPracticalCount) {
//            Double efficientUserNum = pOrgUserRecord.getColumn(QYHYKeyEnum.EFFICIENT_USER_NUM.ordinal()).asDouble();
//            pOrgUserRecord.setColumn(QYHYKeyEnum.EFFICIENT_USER_NUM.ordinal(), new DoubleColumn(efficientUserNum + 1));
//        }
//
//        // 有效率 todo
//
//        // 电压合格率
//        Double monitorTime = vo.getMonitorTime();
//        Double upTime = vo.getUpTime();
//        Double downTime = vo.getDownTime();
//        Double orgupTime = pOrgUserRecord.getColumn(QYHYKeyEnum.UPER_TIME.ordinal()).asDouble();
//        Double orgDownTime = pOrgUserRecord.getColumn(QYHYKeyEnum.LOWER_TIME.ordinal()).asDouble();
//        Double orgMonitorTime = pOrgUserRecord.getColumn(QYHYKeyEnum.MONITOR_TIME.ordinal()).asDouble();
//        orgMonitorTime += monitorTime;
//        orgupTime += upTime;
//        orgDownTime += downTime;
//        double voltageQualifiedRate = (1 - ((orgupTime + orgDownTime)) / orgMonitorTime) * 100;
//        pOrgUserRecord.setColumn(QYHYKeyEnum.VOLTAGE_QUALIFIED_RATE.ordinal(), new DoubleColumn(voltageQualifiedRate));
//
//        String pbtype = vo.getPbtype();
//        if (PbTypeConstant.GY.equals(pbtype)) {
//            // 高电压用户数量
//            Double highVoltageUserNum = pOrgUserRecord.getColumn(QYHYKeyEnum.HIGH_VOLTAGE_USER_NUM.ordinal()).asDouble();
//            highVoltageUserNum++;
//            pOrgUserRecord.setColumn(QYHYKeyEnum.HIGH_VOLTAGE_USER_NUM.ordinal(), new DoubleColumn(highVoltageUserNum));
//            // 高电压用户占比
//            double highVoltageUserRate = (highVoltageUserNum / realUserNum) * 100;
//            pOrgUserRecord.setColumn(QYHYKeyEnum.HIGH_VOLTAGE_USER_RATE.ordinal(), new DoubleColumn(highVoltageUserRate));
//        } else if (PbTypeConstant.DY.equals(pbtype)) {
//            // 低电压用户数量
//            Double lowVoltageUserNum = pOrgUserRecord.getColumn(QYHYKeyEnum.LOW_VOLTAGE_USER_NUM.ordinal()).asDouble();
//            lowVoltageUserNum++;
//            pOrgUserRecord.setColumn(QYHYKeyEnum.LOW_VOLTAGE_USER_NUM.ordinal(), new DoubleColumn(lowVoltageUserNum));
//            // 低电压用户占比
//            double lowVoltageUserRate = (lowVoltageUserNum / realUserNum) * 100;
//            pOrgUserRecord.setColumn(QYHYKeyEnum.LOW_VOLTAGE_USER_RATE.ordinal(), new DoubleColumn(lowVoltageUserRate));
//        } else {
//            // 合格电压用户数量
//            Double qualifiedUserNum = pOrgUserRecord.getColumn(QYHYKeyEnum.QUALIFIED_USER_NUM.ordinal()).asDouble();
//            pOrgUserRecord.setColumn(QYHYKeyEnum.QUALIFIED_USER_NUM.ordinal(), new DoubleColumn(qualifiedUserNum + 1));
//        }
//
//        // 监测总时间
//        pOrgUserRecord.setColumn(QYHYKeyEnum.MONITOR_TIME.ordinal(), new DoubleColumn(orgMonitorTime));
//
//        // 合格时间
//        double qualifiedTime = monitorTime - upTime - downTime;
//        Double orgQualifiedTime = pOrgUserRecord.getColumn(QYHYKeyEnum.QUALIFIED_TIME.ordinal()).asDouble();
//        orgQualifiedTime += qualifiedTime;
//        pOrgUserRecord.setColumn(QYHYKeyEnum.QUALIFIED_TIME.ordinal(), new DoubleColumn(orgQualifiedTime));
//
//        // 超上限时间
//        pOrgUserRecord.setColumn(QYHYKeyEnum.UPER_TIME.ordinal(), new DoubleColumn(orgupTime));
//        // 超上限率
//        double orgUpRate = (orgupTime / orgMonitorTime) * 100;
//        pOrgUserRecord.setColumn(QYHYKeyEnum.UPER_RATE.ordinal(), new DoubleColumn(orgUpRate));
//        // 超下限时间
//        pOrgUserRecord.setColumn(QYHYKeyEnum.LOWER_TIME.ordinal(), new DoubleColumn(orgDownTime));
//        // 超下限率
//        double orgDownRate = (orgDownTime / orgMonitorTime) * 100;
//        pOrgUserRecord.setColumn(QYHYKeyEnum.LOWER_RATE.ordinal(), new DoubleColumn(orgDownRate));
//
//        // 电压最大值
//        Double maxValue = vo.getMaxValue();
//        Double orgMaxValue = pOrgUserRecord.getColumn(QYHYKeyEnum.MAX_VALUE.ordinal()).asDouble();
//        if (orgMaxValue < maxValue) {
//            pOrgUserRecord.setColumn(QYHYKeyEnum.MAX_VALUE.ordinal(), new DoubleColumn(maxValue));
//            // 电压最大值时刻
//            pOrgUserRecord.setColumn(QYHYKeyEnum.MAX_VALUE_TIME.ordinal(), new DateColumn(vo.getMaxValueTime()));
//        }
//
//        // 电压最小值
//        Double minValue = vo.getMinValue();
//        Double orgMinValue = pOrgUserRecord.getColumn(QYHYKeyEnum.MIN_VALUE.ordinal()).asDouble();
//        if (orgMinValue < minValue) {
//            pOrgUserRecord.setColumn(QYHYKeyEnum.MIN_VALUE.ordinal(), new DoubleColumn(minValue));
//            // 电压最小值时刻
//            pOrgUserRecord.setColumn(QYHYKeyEnum.MIN_VALUE_TIME.ordinal(), new DateColumn(vo.getMinValueTime()));
//        }
//
//        // 有效数据时间
//        Double orgEffectiveDataTime = pOrgUserRecord.getColumn(QYHYKeyEnum.EFFECTIVE_DATA_TIME.ordinal()).asDouble();
//        orgEffectiveDataTime += validDataTime;
//        pOrgUserRecord.setColumn(QYHYKeyEnum.EFFECTIVE_DATA_TIME.ordinal(), new DoubleColumn(orgEffectiveDataTime));
//
//    }
//}
